#include "historiquerequetes.h"

HistoriqueRequetes::HistoriqueRequetes(QWidget *parent) :
    QWidget(parent)
{
    // On met en place l'interface graphique
    setupUi();

    chargerRequetes();
}

HistoriqueRequetes::~HistoriqueRequetes()
{
    enregistrer();
}

void HistoriqueRequetes::setupUi()
{
    vbPrincipale = new QVBoxLayout;
    tree = new QTreeWidget(this);

    actRefresh = new QAction("Actualiser", tree);
    actRename = new QAction("Renommer", tree);
    actSave = new QAction("Enregistrer", tree);
    actDelete = new QAction("Supprimer", tree);
    actFavoris = new QAction("Favoris", tree);

    QObject::connect(actRefresh, SIGNAL(triggered()),this, SLOT(afficherArbre()));
    QObject::connect(actRename, SIGNAL(triggered()),this, SLOT(nommer()));
    QObject::connect(actSave, SIGNAL(triggered()),this, SLOT(enregistrer()));
    QObject::connect(actDelete, SIGNAL(triggered()),this, SLOT(supprimer()));
    QObject::connect(actFavoris, SIGNAL(triggered()),this, SLOT(mettreEnFavoris()));

    tree->addAction(actRefresh);
    tree->addAction(actRename);
    tree->addAction(actSave);
    tree->addAction(actDelete);
    tree->addAction(actFavoris);
    tree->setContextMenuPolicy(Qt::ActionsContextMenu);

    tree->setHeaderLabels(QStringList("Historique"));
    tree->header()->setSectionResizeMode(QHeaderView::Stretch);
    QObject::connect(tree, SIGNAL(currentItemChanged(QTreeWidgetItem*,QTreeWidgetItem*)), this, SLOT(afficheRequete(QTreeWidgetItem*,QTreeWidgetItem*)));

    btnSave = new QPushButton("Enregistrer");
    QObject::connect(btnSave, SIGNAL(clicked()), this, SLOT(enregistrer()));

    vbPrincipale->addWidget(tree);
    vbPrincipale->addWidget(btnSave);
    //vbPrincipale->setContentsMargins(0,0,0,0);

    QGroupBox* gb = new QGroupBox;
    gb->setLayout(vbPrincipale);
    gb->setStyleSheet("QGroupBox { background-color : rgb(127,127,127); }");
    QVBoxLayout* vbp2 = new QVBoxLayout;
    vbp2->addWidget(gb);
    vbp2->setContentsMargins(0,0,0,0);

    setLayout(vbp2);
}

void HistoriqueRequetes::requeteListener(QString q)
{
    listeRequete.push_back(Requete(q));

    afficherArbre();
}


/*
 * Méthode qui lit le fichier "requetes.xml" et remplit la liste des requêtes
 */
void HistoriqueRequetes::chargerRequetes()
{
    QFile f("requetes.xml");

    if(f.open(QIODevice::ReadOnly))
    {
        QDomDocument doc;
        QString error;
        int ligne;
        int colonne;
        if(doc.setContent(&f, &error, &ligne, &colonne))
        {
            QString query;
            QString name;
            bool favoris;
            QDateTime date;

            QDomNode nodeBlock = doc.documentElement();
            for(int i = 0; i < nodeBlock.childNodes().size(); i++)
            {
                favoris = static_cast<bool>(nodeBlock.childNodes().at(i).toElement().attribute("favoris").toUInt());
                query = nodeBlock.childNodes().at(i).toElement().text();
                name = nodeBlock.childNodes().at(i).toElement().attribute("name");
                date = QDateTime::fromString(nodeBlock.childNodes().at(i).toElement().attribute("date"), "dd/MM/yyyy hh:mm:ss:zzz");

                Requete r(query);
                r.setFavoris(favoris);
                r.setNom(name);
                r.setDate(date);
                listeRequete.push_back(r);
            }
            afficherArbre();
        }
        else
        {
            QMessageBox::warning(this, "Erreur requètes : XML", "Erreur lors de la lecture du document requetes.xml : \"" + error + "\" à la ligne " + QString::number(ligne) + "\" à la colonne " + QString::number(colonne));
        }

        f.close();
    }
    else
    {
        QMessageBox::warning(this, "Erreur requètes : XML", "Erreur lors de l'ouverture (ReadOnly) du document requetes.xml");
    }
}

/*
 * Méthode qui enregistre dans le fichier "requetes.xml" toute la liste des requêtes
 */
void HistoriqueRequetes::enregistrerRequetes()
{
    if(!listeRequete.isEmpty())
    {
        QFile f("requetes.xml");

        if(f.open(QIODevice::WriteOnly))
        {
            QDomElement req;
            QDomText text;
            QDomDocument doc;
            QDomElement requetes = doc.createElement("requetes");

            for(int i = 0; i < listeRequete.size(); i++)
            {
                req = doc.createElement(QString("req%1").arg(i));
                req.setAttribute("name", listeRequete.at(i).getName());
                req.setAttribute("date", listeRequete.at(i).getDate().toString("dd/MM/yyyy hh:mm:ss:zzz"));
                req.setAttribute("favoris", static_cast<int>(listeRequete.at(i).isFavoris()));
                text = doc.createTextNode(listeRequete.at(i).getQuery());
                req.appendChild(text);
                requetes.appendChild(req);
            }

            doc.appendChild(requetes);
            QDomNode noeud = doc.createProcessingInstruction("xml","version=\"1.0\" encoding=\"ISO-8859-1\"");
            doc.insertBefore(noeud,doc.firstChild());

            f.resize(0);
            QTextStream t(&f);
            doc.save(t,2);
            f.close();
        }
        else
        {
            QMessageBox::warning(this, "Erreur requètes : XML", "Erreur lors de l'écriture (WriteOnly) du document requetes.xml");
        }
    }
}

/*
 * Méthode qui affiche l'arbre en se basant sur la liste des requêtes
 */
void HistoriqueRequetes::afficherArbre()
{
    tree->clear();
    qSort(listeRequete);

    QTreeWidgetItem *favoris = new QTreeWidgetItem(tree);
    QTreeWidgetItem *histo = new QTreeWidgetItem(tree);

    favoris->setText(0,"Favoris");
    for(int i = 0; i < listeRequete.size(); i++)
    {
        if(listeRequete.at(i).isFavoris())
        {
            // On crée un item de l'arbre
            QTreeWidgetItem *item = new QTreeWidgetItem(favoris);

            item->setData(0, Qt::UserRole, listeRequete.at(i).toString());
            // On définit le nom de la requète dans l'item
            item->setText(0, QString(listeRequete.at(i).getName() + " " + listeRequete.at(i).getDate().toString("dd/MM/yy hh:mm")).trimmed());
        }
    }

    histo->setText(0,"Historique");
    for(int i = 0; i < listeRequete.size(); i++)
    {
        // On crée un item de l'arbre
        QTreeWidgetItem *item = new QTreeWidgetItem(histo);

        item->setData(0, Qt::UserRole, listeRequete.at(i).toString());
        // On définit le nom de la requète dans l'item
        item->setText(0, QString(listeRequete.at(i).getName() + " - " + listeRequete.at(i).getDate().toString("dd/MM/yy hh:mm")).trimmed());
    }
}

void HistoriqueRequetes::afficheRequete(QTreeWidgetItem* current, QTreeWidgetItem*)
{
    if(current != 0 && !current->data(0,Qt::UserRole).isNull())
    {
        int i = listeRequete.indexOf(Requete::fromString(current->data(0,Qt::UserRole).toString()));
        if(i >= 0 && i < listeRequete.size())
        {
            emit sendRequete(listeRequete.at(i).getQuery());
        }
    }
}

void HistoriqueRequetes::supprimer()
{
    QTreeWidgetItem* current = tree->currentItem();

    if(current != 0)
    {
        if(!current->data(0,Qt::UserRole).isNull())
        {
            int i = listeRequete.indexOf(Requete::fromString(current->data(0,Qt::UserRole).toString()));
            if(i >= 0 && i < listeRequete.size())
            {
                int rep = QMessageBox::question(this, "Confirmation", "Êtes-vous sûr de vouloir supprimer cette requête ?", QMessageBox::Yes, QMessageBox::Cancel);
                if(rep == QMessageBox::Yes)
                {
                    listeRequete.removeAt(i);
                    afficherArbre();
                }
            }
        }
        else if(current->text(0) == "Historique")
        {
            int nbHist = 0;
            for(int i = 0; i < listeRequete.size(); i++)
            {
                if(!listeRequete.at(i).isFavoris())
                {
                    nbHist++;
                }
            }
            if(nbHist > 0)
            {
                int rep = QMessageBox::question(this, "Confirmation", "Êtes-vous sûr de vouloir supprimer les " + QString::number(nbHist) + " requêtes ne faisant pas partie des favoris ?", QMessageBox::Yes, QMessageBox::Cancel);
                if(rep == QMessageBox::Yes)
                {
                    for(int i = listeRequete.size()-1; i >= 0; i--)
                    {
                        if(!listeRequete.at(i).isFavoris())
                        {
                            listeRequete.removeAt(i);
                        }
                    }
                    afficherArbre();
                }
            }
        }
    }
}

void HistoriqueRequetes::mettreEnFavoris()
{
    QTreeWidgetItem* current = tree->currentItem();

    if(current != 0)
    {
        if(!current->data(0,Qt::UserRole).isNull())
        {
            int i = listeRequete.indexOf(Requete::fromString(current->data(0,Qt::UserRole).toString()));
            if(i >= 0 && i < listeRequete.size())
            {
                int rep;
                if(!listeRequete.at(i).isFavoris())
                {
                    rep = QMessageBox::question(this, "Confirmation", "Êtes-vous sûr de vouloir passer cette requête en favoris ?", QMessageBox::Yes, QMessageBox::Cancel);
                }
                else
                {
                    rep = QMessageBox::question(this, "Confirmation", "Êtes-vous sûr de vouloir retirer cette requête de vos favoris ?", QMessageBox::Yes, QMessageBox::Cancel);
                }

                if(rep == QMessageBox::Yes)
                {
                    listeRequete[i].setFavoris(!listeRequete.at(i).isFavoris());
                    afficherArbre();
                }
            }
        }
    }
}

void HistoriqueRequetes::nommer()
{
    QTreeWidgetItem* current = tree->currentItem();

    if(current != 0)
    {
        if(!current->data(0,Qt::UserRole).isNull())
        {
            int i = listeRequete.indexOf(Requete::fromString(current->data(0,Qt::UserRole).toString()));
            QString name = QInputDialog::getText(this, "Nom de requête", "Veuillez entrer le nom de la requête", QLineEdit::Normal, listeRequete.at(i).getName());
            if(!name.isEmpty())
            {
                listeRequete[i].setNom(name);
                afficherArbre();
            }
        }
    }
}

void HistoriqueRequetes::enregistrer()
{
    int rep = QMessageBox::question(this, "Confirmation", "Voulez-vous enregistrer vos requêtes ?", QMessageBox::Yes, QMessageBox::No);
    if(rep == QMessageBox::Yes)
    {
        enregistrerRequetes();
    }
}
